algebraic effects
詳しくいうと、例外におけるtry節に相当するhandle節をdelimiterとした限定継続が取れて、関数のようにハンドラで使える たとえばTypeScriptでは例外を投射したり捕捉したりできるよね?
code:typescript
const div = (a: number, b: number): number => {
// 例外を投げる
if (b === 0) throw new RangeError("divider is zero");
return a / b;
};
const div365By = (b: number) => div(365, b);
// 例外を途中でハンドリングしてnullで返してみる
// この関数は例外を投げない
const div365SafelyBy = (b: number): number | null => {
try {
return div365By(0); // divがthrowする
} catch (e) { // ここでハンドリング
return null;
}
};
ここで catch の部分が catch(e, k) というようになる
k ってなに?←(限定)継続
計算の残りの部分
関数fの中でエフェクトEを発射するとする
Eのインターフェースは決まっている
しかし、Eが具体的にどのような意味を持つのかについてfは知らない
Eの具体的な意味はハンドラが規定する
関数の返り値にエフェクトが出てくる
継続がワンショット
1回しか呼び出せない